#ifndef IMAGE_VISUALIZATION_NODE_H
#define IMAGE_VISUALIZATION_NODE_H

#include <cv_bridge/cv_bridge.h>
#include <image_transport/image_transport.h>
#include <ros/ros.h>
#include <sensor_msgs/image_encodings.h>

#include <QImage>
#include <QThread>
#include <memory>

#include "utils/config.h"
#include "utils/config_struct.h"

namespace project_template {

class ImageVisualizationNode : public QThread {
  Q_OBJECT

 public:
  /**
   * @brief ImageVisualizationNode
   */
  ImageVisualizationNode();

  virtual ~ImageVisualizationNode();

  /**
   * @brief init
   * @return
   */
  bool init();

  /**
   * @brief run
   */
  void run();

 private:
  /**
   * @brief RGB数据订阅
   * @param _msg
   */
  void RgbImageCallback(const sensor_msgs::ImageConstPtr &_msg);

  /**
   * @brief 深度图像订阅
   * @param _msg
   */
  void DepthImageCallback(const sensor_msgs::ImageConstPtr &_msg);

  /**
   * @brief cv::Mat转QImage
   * @param _src
   * @return
   */
  QImage Mat2QImage(cv::Mat const &_src);

  /**
   * @brief QImage转cv::Mat
   * @param _image
   * @return
   */
  cv::Mat QImage2Mat(QImage &_image);

  /**
   * @brief 加载配置参数
   * @param _path_of_yaml
   */
  void LoadConfigParam(std::string _path_of_yaml);

 signals:
  /**
   * @brief 关闭信号
   *
   */
  void rosShutdown();

  /**
   * @brief RGB图像数据信号
   */
  void showRGBImage(QImage);

  /**
   * @brief 深度图像数据信号
   */
  void showDepthImage(QImage);

 private:
  /// @brief 配置参数
  ImageVisualizationConfig image_visualization_config_;

  /// @brief RGB图像订阅器
  image_transport::Subscriber sub_rgb_image_;
  /// @brief 深度图像订阅器
  image_transport::Subscriber sub_depth_image_;
};

}  // namespace project_template

#endif  // IMAGE_VISUALIZATION_NODE_H
